// lib/models/post.dart
import 'package:json_annotation/json_annotation.dart';
import 'community.dart'; // 导入社区模型
import 'stats.dart';     // 导入统计模型

part 'post.g.dart';

/**
 * 帖子数据模型
 * 用于表示应用中的帖子信息，包含帖子的基本信息、作者信息、社区信息和统计数据
 * 使用json_serializable进行JSON序列化和反序列化
 */
@JsonSerializable(
  explicitToJson: true,         // 显式生成toJson方法
  includeIfNull: false,         // 不包含null值字段
  checked: true,                // 启用检查模式确保类型安全
)
class Post {
  @JsonKey(name: 'id') // 移除 defaultValue，因为 int 类型不建议使用 '0' 作为默认值
  final String postId; // 后端`id`字段映射到这里作为帖子ID，修改为 int 类型

  @JsonKey(name: 'author_id')
  final int? authorId; // 作者ID，对应后端的author_id字段，数值类型

  @JsonKey(name: 'author_name', defaultValue: '')
  final String authorName; // 作者名称

  @JsonKey(name: 'community_id')
  final int? communityId; // 所属社区ID

  @JsonKey(name: 'status', defaultValue: 0)
  final int status; // 帖子状态：0-正常, 1-已删除, 2-已屏蔽等

  @JsonKey(name: 'title', defaultValue: '')
  final String title; // 帖子标题

  @JsonKey(name: 'content', defaultValue: '')
  final String content; // 帖子内容

  // @JsonKey(name: 'vote_num', defaultValue: 0) // 根据你的要求已移除此属性
  // final int voteNum; // 投票数/点赞数

  @JsonKey(name: 'create_time')
  final DateTime? createTime; // 创建时间，自动解析ISO 8601格式字符串

  // 嵌套对象
  @JsonKey(name: 'community')
  final Community? community; // 社区信息对象

  @JsonKey(name: 'stats')
  final Stats? stats; // 统计信息对象

  // 构造函数
  Post({
    required this.postId,
    this.authorId,
    required this.authorName,
    this.communityId,
    this.status = 0,
    required this.title,
    required this.content,
    // this.voteNum = 0, // 移除 voteNum
    this.createTime,
    this.community,
    this.stats,
  });

  // JSON序列化和反序列化工厂方法
  factory Post.fromJson(Map<String, dynamic> json) => _$PostFromJson(json);
  Map<String, dynamic> toJson() => _$PostToJson(this);

  // 复制方法，用于创建修改后的新实例
  Post copyWith({
    String? postId, // 修改为 int?
    int? authorId,
    String? authorName,
    int? communityId,
    int? status,
    String? title,
    String? content,
    int? voteNum, // 移除此处的 voteNum
    DateTime? createTime,
    Community? community,
    Stats? stats,
  }) {
    return Post(
      postId: postId ?? this.postId,
      authorId: authorId ?? this.authorId,
      authorName: authorName ?? this.authorName,
      communityId: communityId ?? this.communityId,
      status: status ?? this.status,
      title: title ?? this.title,
      content: content ?? this.content,
      // voteNum: voteNum ?? this.voteNum, // 移除 voteNum
      createTime: createTime ?? this.createTime,
      community: community ?? this.community,
      stats: stats ?? this.stats,
    );
  }

  // 重写toString方法，便于调试
  @override
  String toString() {
    return 'Post(id: $postId, title: $title, author: $authorName, community: ${community?.communityName})';
  }
}